package string.leetcode.easy;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author bruin_du
 * @description 第一个只出现一次的字符
 * @date 2022/5/18 19:10
 **/
public class Offer50_FirstUniqChar {
    int choice = 1;
    public char firstUniqChar(String s) {
        //使用数组按照字典序存储字符出现次数
        if(choice == 1) {
            if (s.length() == 0)
                return ' ';
            if (s.length() == 1)
                return s.charAt(0);
            char[] chars = new char[26];
            for (int i = 0; i < s.length(); i++) {
                char ch = s.charAt(i);
                chars[ch - 'a']++;
            }
            for (int i = 0; i < s.length(); i++) {
                char ch = s.charAt(i);
                if (chars[ch - 'a'] == 1)
                    return ch;
            }
            return ' ';
        }


        //如果使用Map<Character,Boolean>进行查重查找的话，可以使用有序哈希表存储效率更高
        //但是还是不及数组
        //此时遍历第二遍的时候可以节省时间,因为Map最多也就26个键值对
        if(choice == 2){
            if (s.length() == 0)
                return ' ';
            if (s.length() == 1)
                return s.charAt(0);
            Map<Character,Integer> map = new LinkedHashMap<>();
            for (int i = 0; i < s.length(); i++) {
                char ch = s.charAt(i);
                map.put(ch, map.getOrDefault(ch, 0) + 1);
            }
            for(Map.Entry<Character,Integer> tmp: map.entrySet()){
                if(tmp.getValue() == 1)
                    return tmp.getKey();
            }
            return ' ';
        }
        return ' ';
    }
}
